package cn.vehicle.threadLocal;

import cn.vehicle.domains.info.UserInfo;

/**
 * 用户上下文 ThreadLocal 管理类
 * <p>
 * 用于在单个线程中保存和访问当前登录用户的信息。
 * 通过 ThreadLocal 实现线程隔离，确保多线程环境下的用户信息安全与独立。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>保存当前线程的用户信息；</li>
 *   <li>提供获取、设置与清理用户信息的方法；</li>
 *   <li>用于权限拦截器、业务逻辑层等需要访问当前用户上下文的场景。</li>
 * </ul>
 *
 * <p>注意：</p>
 * <ul>
 *   <li>使用后务必调用 {@link #remove()} 方法清理，避免内存泄漏；</li>
 *   <li>ThreadLocal 数据仅在当前线程可见，线程池复用场景下尤其需要注意清理。</li>
 * </ul>
 */
public class UserContextThreadLocal {

    private final static ThreadLocal<UserInfo> userInfoThreadLocal = new ThreadLocal<>();

    /**
     * 获取当前线程中的用户信息
     *
     * @return 当前线程绑定的用户信息对象，若未设置则返回 null
     */
    public static UserInfo getUserInfo() {
        // 从 ThreadLocal 中获取当前线程存储的用户信息
        return userInfoThreadLocal.get();
    }

    /**
     * 设置当前线程的用户信息
     *
     * @param userInfo 待绑定的用户信息对象
     */
    public static void setUserInfo(UserInfo userInfo) {
        // 将用户信息绑定到当前线程上下文中
        userInfoThreadLocal.set(userInfo);
    }

    /**
     * 移除当前线程中的用户信息
     * <p>调用后可防止内存泄漏，建议在请求完成或线程结束时执行。</p>
     */
    public static void remove() {
        // 清理当前线程的用户信息，释放资源
        userInfoThreadLocal.remove();
    }
}
